<!DOCTYPE html>
<html lang="en-us">
  <head>
  <meta http-equiv="content-type" content="text/html;charset=utf-8">
  <meta http-equiv="X-UA-Compatible" content="chrome=1">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <meta name="robots" content="noodp"/>
  <meta name="author" content="Mr.wei">
  
  
  
  <link rel="prev" href="http://blog.mr-wei.cn/2019/makefile-%E8%87%AA%E5%8A%A8%E5%8C%96%E5%8F%98%E9%87%8F/" />
  <link rel="next" href="http://blog.mr-wei.cn/2019/linux-nohup-screen/" />
  <link rel="canonical" href="http://blog.mr-wei.cn/2019/makefile-%E5%86%85%E5%B5%8C%E5%87%BD%E6%95%B0/" />
  <link rel="apple-touch-icon" sizes="180x180" href="/apple-touch-icon.png">
  <link rel="icon" type="image/png" sizes="32x32" href="/favicon-32x32.png">
  <link rel="icon" type="image/png" sizes="16x16" href="/favicon-16x16.png">
  <link rel="manifest" href="/site.webmanifest">
  <link rel="mask-icon" href="/safari-pinned-tab.svg" color="#5bbad5">
  <meta name="msapplication-TileColor" content="#da532c">
  <meta name="theme-color" content="#ffffff">
  <title>
       
       
           Makefile 内嵌函数 | Mr.wei
       
  </title>
  <meta name="title" content="Makefile 内嵌函数 | Mr.wei">
    
  
  <link rel="stylesheet" href="/font/iconfont.css">
  <link rel="stylesheet" href="/css/main.min.css">


  
  
 

<script type="application/ld+json">
 "@context" : "http://schema.org",
    "@type" : "BlogPosting",
    "mainEntityOfPage": {
         "@type": "WebPage",
         "@id": "http:\/\/blog.mr-wei.cn"
    },
    "articleSection" : "posts",
    "name" : "Makefile 内嵌函数",
    "headline" : "Makefile 内嵌函数",
    "description" : "函数的调用语法 GNU make 函数的调用格式类似于变量的引用，以$开始表示一个引用\n$(Function Arguments) 或者 ${Function Arguments}   调用语法格式中Function是需要调用的函数名，它应该是make内嵌的函数名 Arguments是函数的参数，参数和函数名之间使用空格分隔，多个参数之间使用逗号分隔 以$开头使用成对的圆括号或者花括号把函数名和参数括起来。参数中存在变量或者函数的引用时，对它们所使用的分隔符建议和引用函数的相同 函数处理参数时，参数中如果存在对其它变量或者函数的引用，首先对这些引用进行展开得到参数的实际内容，然后才对它们进行处理，参数的展开顺序是按照参数的先后顺序来进行 函数的参数不能直接出现逗号和空格。当有逗号或者空格作为函数的参数时，需要将它们赋值给一个变量，在函数的参数中引用这个变量来实现。  内置函数 $(subst FROM,TO,TEXT)  函数名称：字符串替换函数 函数功能：将字符串TEXT中的FROM字符替换为TO 返回值：替换后的新字符串 示例\n#Makfile str := $(subst subst function,SUBST FUNCTION,this is a subst function test!); test: @ echo src = $(str) #执行make输出 str = this is a SUBST FUNCTION test!   $(patsubst PATTERN,REPLACEMENT,TEXT)  函数名称：模式替换函数 函数功能：搜索TEXT中以空格分隔的单词，将符合模式PATTERN的替换为REPLACEMENT。参数PATTERN 中可以使用通配符%来代表一个单词中的若干字符。如果参数REPLACEMENT中也包含一个%，那么REPLACEMENT中的%将是PATTERN中的那个%所代表的字符串。PATTERN和REPLACEMENT中只有第一个%被作为模式字符处理，之后出现的作为一个字符处理。参数中如果需要将第一个%作为字符本身而不是作为模式字符时，需要使用\\进行转义。 返回值：替换后的新字符串 说明：TEXT单词之间的多个空格在处理时被合并为一个空格，并忽略前导和结尾空格 示例\n#Makfile str1 := $(patsubst tpl\/%,%,scripts\/basic tpl\/abc tpl\/123); str2 = $(patsubst %.",
    "inLanguage" : "en-us",
    "author" : "Mr.wei",
    "creator" : "Mr.wei",
    "publisher": "Mr.wei",
    "accountablePerson" : "Mr.wei",
    "copyrightHolder" : "Mr.wei",
    "copyrightYear" : "2019",
    "datePublished": "2019-09-02 09:11:02 \x2b0800 CST",
    "dateModified" : "2019-09-02 09:11:02 \x2b0800 CST",
    "url" : "http:\/\/blog.mr-wei.cn\/2019\/makefile-%E5%86%85%E5%B5%8C%E5%87%BD%E6%95%B0\/",
    "wordCount" : "255",
    "keywords" : [ "Make", "Mr.wei"]
}
</script>

</head>

  


  <body class="">
    <div class="wrapper">
        <nav class="navbar">
    <div class="container">
        <div class="navbar-header header-logo">
        	<a href="javascript:void(0);" class="theme-switch"><i class="iconfont icon-xihuan"></i></a>&nbsp;<a href="http://blog.mr-wei.cn">Mr.wei</a>
        </div>
        <div class="menu navbar-right">
                
                
                <a class="menu-item" href="/posts/" title="">Blog</a>
                
                <a class="menu-item" href="http://balance.mr-wei.cn" title="">BalanceCar</a>
                
                <a class="menu-item" href="/categories/" title="">Categories</a>
                
                <a class="menu-item" href="/tags/" title="">Tags</a>
                
                <a class="menu-item" href="/about/" title="About">About</a>
                
        </div>
    </div>
</nav>
<nav class="navbar-mobile" id="nav-mobile" style="display: none">
     <div class="container">
        <div class="navbar-header">
            <div>  <a href="javascript:void(0);" class="theme-switch"><i class="iconfont icon-xihuan"></i></a>&nbsp;<a href="http://blog.mr-wei.cn">Mr.wei</a></div>
            <div class="menu-toggle">
                <span></span><span></span><span></span>
            </div>
        </div>
     
          <div class="menu" id="mobile-menu">
                
                
                <a class="menu-item" href="/posts/" title="">Blog</a>
                
                <a class="menu-item" href="http://balance.mr-wei.cn" title="">BalanceCar</a>
                
                <a class="menu-item" href="/categories/" title="">Categories</a>
                
                <a class="menu-item" href="/tags/" title="">Tags</a>
                
                <a class="menu-item" href="/about/" title="About">About</a>
                
        </div>
    </div>
</nav>







    	 <main class="main">
          <div class="container">
      		
<article class="post-warp" itemscope itemtype="http://schema.org/Article">
    <header class="post-header">
        <h1 class="post-title" itemprop="name headline">Makefile 内嵌函数</h1>
        <div class="post-meta">
                Written by <a itemprop="name" href="http://blog.mr-wei.cn" rel="author">Mr.wei</a> with ♥ 
                <span class="post-time">
                on <time datetime=2019-09-02 itemprop="datePublished">September 2, 2019</time>
                </span>
                in
                <i class="iconfont icon-folder"></i>
                <span class="post-category">
                        
                </span>
        </div>
    </header>
    <div class="post-content">
        

        

        
        
     
          
          
          

          
          
          

          

<h1 id="函数的调用语法">函数的调用语法</h1>

<p>GNU make 函数的调用格式类似于变量的引用，以<code>$</code>开始表示一个引用</p>

<pre><code class="language-makefile">$(Function Arguments)
或者
${Function Arguments}
</code></pre>

<ol>
<li>调用语法格式中<code>Function</code>是需要调用的函数名，它应该是<code>make</code>内嵌的函数名</li>
<li><code>Arguments</code>是函数的参数，参数和函数名之间使用空格分隔，多个参数之间使用逗号分隔</li>
<li>以<code>$</code>开头使用成对的圆括号或者花括号把函数名和参数括起来。参数中存在变量或者函数的引用时，对它们所使用的分隔符建议和引用函数的相同</li>
<li>函数处理参数时，参数中如果存在对其它变量或者函数的引用，首先对这些引用进行展开得到参数的实际内容，然后才对它们进行处理，参数的展开顺序是按照参数的先后顺序来进行</li>
<li>函数的参数不能直接出现逗号和空格。当有逗号或者空格作为函数的参数时，需要将它们赋值给一个变量，在函数的参数中引用这个变量来实现。</li>
</ol>

<!--more -->

<h1 id="内置函数">内置函数</h1>

<h2 id="subst-from-to-text">$(subst FROM,TO,TEXT)</h2>

<ul>
<li>函数名称：字符串替换函数</li>
<li>函数功能：将字符串TEXT中的FROM字符替换为TO</li>
<li>返回值：替换后的新字符串</li>

<li><p>示例</p>

<pre><code class="language-makefile">#Makfile
str := $(subst subst function,SUBST FUNCTION,this is a subst function test!);
test:
	@ echo src = $(str)
#执行make输出
str = this is a SUBST FUNCTION test!
</code></pre></li>
</ul>

<h2 id="patsubst-pattern-replacement-text">$(patsubst PATTERN,REPLACEMENT,TEXT)</h2>

<ul>
<li>函数名称：模式替换函数</li>
<li>函数功能：搜索TEXT中以空格分隔的单词，将符合模式PATTERN的替换为REPLACEMENT。参数PATTERN 中可以使用通配符%来代表一个单词中的若干字符。如果参数REPLACEMENT中也包含一个%，那么REPLACEMENT中的%将是PATTERN中的那个%所代表的字符串。PATTERN和REPLACEMENT中只有第一个%被作为模式字符处理，之后出现的作为一个字符处理。参数中如果需要将第一个%作为字符本身而不是作为模式字符时，需要使用\进行转义。</li>
<li>返回值：替换后的新字符串</li>
<li>说明：TEXT单词之间的多个空格在处理时被合并为一个空格，并忽略前导和结尾空格</li>

<li><p>示例</p>

<pre><code class="language-makefile">#Makfile
str1 := $(patsubst tpl/%,%,scripts/basic tpl/abc tpl/123);
str2 = $(patsubst %.c,%.o,a.c b.c c.cc d.c.c)
test:
	@ echo src1 = $(str1)
	@ echo src2 = $(str2)
#执行make输出
str1 = scripts/basic abc 123
str2 = a.o b.o c.cc d.c.o
</code></pre></li>
</ul>

<h2 id="strip-strint">$(strip STRINT)</h2>

<ul>
<li>函数名称：去空格</li>
<li>函数功能：去掉子串STRINT开头和结尾的空字符，并将其中多个连续空字符合并为一个空字符</li>
<li>返回值：无前导和结尾空字符，并使用单一空格分隔的多个单词字符串</li>

<li><p>示例</p>

<pre><code class="language-makefile">#Makfile
str := $(strip    this    is   a   str    function    test   !);
test:
	@ echo str = $(str)
#执行make输出
str = this is a str function test !
</code></pre></li>
</ul>

<h2 id="findstring-find-in">$(findstring FIND,IN)</h2>

<ul>
<li>函数功能：搜索子串IN查找FIND子串</li>
<li>返回值：返回FIND或空</li>
<li>函数说明：IN中可以包含空格、TAB键，搜索需要严格匹配</li>

<li><p>示例</p>

<pre><code class="language-makefile">#Makfile
str := $(findstring test, this is a findstring test function);
test:
	@ echo str = $(str)
#执行make输出
str = test
</code></pre></li>
</ul>

<h2 id="filter-pattern-test">$(filter PATTERN&hellip;.,TEST)</h2>

<ul>
<li>函数功能：过滤字符串TEXT 中所有不符合模式PATTERN的单词，保留所有符合此模式的单词。可以使用多个模式。模式中一般需要包含模式字符%。存在多个模式时，模式表达式之间使用空格分隔。</li>
<li>返回值：空格分隔的TEXT子串串中所有符合模式PATTERN的子串</li>

<li><p>示例</p>

<pre><code class="language-makefile">#Makfile
sources := foo.c bar.c baz.s ugh.h
obj:
	@ echo obj = $(filter %.c %.s,$(sources))
#执行make输出
obj = foo.c bar.c baz.s
</code></pre></li>
</ul>

<h2 id="filter-out-pattern-text">$(filter-out PATTERN&hellip;,TEXT)</h2>

<ul>
<li>函数功能：过滤掉子串TEXT中所有符合模式PATTERN的单词，保留所有不符合此模式的单词。可以有多个模式</li>
<li>返回值：空格分隔的TEXT子串中所有不符合PATTERN的子串</li>

<li><p>示例</p>

<pre><code class="language-makefile">#Makfile
sources := foo.c bar.c baz.s ugh.h
obj:
	@ echo obj = $(filter-out %.c %.s,$(sources))
#执行make输出
obj = ugh.h
</code></pre></li>
</ul>

<h2 id="if-condition-then-patr-else-part">$(if CONDITION,THEN-PATR[,ELSE-PART])</h2>

<ul>
<li>函数功能：第一个参数CONDITION，在函数执行时忽略其前导和结尾空字符，如果包含对其他变量或者函数的引用则进行展开。如果CONDITION的展开结果为非空，则条件为真，就将第二个参数THEN-PART作为函数的计算表达式；CONDITION的展开结果为空，将第三个参数ELSE-PART作为函数的表达式，函数的返回结果为有效表达式的计算结果。</li>
<li>返回值：根据条件决定函数的返回值是哪个参数表达式的计算结果。如果不存在第三个参数ELSE-PART并且CONDITION展开为空，则函数返回空。</li>

<li><p>示例</p>

<pre><code class="language-makefile">#Makfile
condition1:=mr-wei
condition2:=
dir1 := $(if $(condition1),/home/mr-wei)
dir2 := $(if $(condition2),/root,/home/mr-wei)
test:
	@ echo src1=$(dir1)
	@ echo src2=$(dir2)
#执行make输出
dir1=/home/mr-wei
dir2=/home/mr-wei
</code></pre></li>
</ul>

<h2 id="addprefix-prefix-name">$(addprefix PREFIX,NAME)</h2>

<ul>
<li>函数功能：为NAMES中的每一个文件名添加前缀PREFIX。参数NAMES是空格分隔的文件名序列，将SUFFIX添加到此序列的每一个文件名之前</li>
<li>返回值：以单控股分隔的添加了前缀的文件名序列</li>
<li>函数说明：NAME为空时返回值为空</li>

<li><p>示例</p>

<pre><code class="language-makefile">#Makfile
obj=a
dir=scripts/basic
obj := $(addprefix $(dir)/,$(obj))
test:
	@ echo dir=$(dir)
#执行make输出
dir=scripts/basic/a
</code></pre></li>
</ul>

<h1 id="参考资料">参考资料</h1>

<ul>
<li><font size=6>Managing Projects with GNU Make</font></li>
</ul>

    </div>

    <div class="post-copyright">
             
            <p class="copyright-item">
                <span>Author:</span>
                <span>Mr.wei </span>
                </p>
            
           
             
            <p class="copyright-item">
                    <span>Link:</span>
                    <a href=http://blog.mr-wei.cn/2019/makefile-%E5%86%85%E5%B5%8C%E5%87%BD%E6%95%B0/>http://blog.mr-wei.cn/2019/makefile-%E5%86%85%E5%B5%8C%E5%87%BD%E6%95%B0/</span>
            </p>
            
             
            <p class="copyright-item lincese">
                本文采用<a rel="license" href="http://creativecommons.org/licenses/by-nc/4.0/" #target="_blank">知识共享署名-非商业性使用 4.0 国际许可协议</a>进行许可
            </p>
            
    </div>

  
    <div class="post-tags">
        
            <section>
            <i class="iconfont icon-tag"></i>Tag(s): 
            
            <span class="tag"><a href="http://blog.mr-wei.cn/tags/make/">
                    #Make</a></span>
            
            </section>
        
        <section>
                <a href="javascript:window.history.back();">back</a></span> · 
                <span><a href="http://blog.mr-wei.cn">home</a></span>
        </section>
    </div>

    <div class="post-nav">
        
        <a href="http://blog.mr-wei.cn/2019/makefile-%E8%87%AA%E5%8A%A8%E5%8C%96%E5%8F%98%E9%87%8F/" class="prev" rel="prev" title="Makefile 自动化变量"><i class="iconfont icon-left"></i>&nbsp;Makefile 自动化变量</a>
         
        
        <a href="http://blog.mr-wei.cn/2019/linux-nohup-screen/" class="next" rel="next" title="Linux nohup和screen">Linux nohup和screen&nbsp;<i class="iconfont icon-right"></i></a>
        
    </div>

    <div class="post-comment">
          
                 
          
    </div>
</article>
          </div>
		   </main>
      <footer class="footer">
    <div class="copyright">
        &copy;
        
        <span itemprop="copyrightYear">2018 - 2019</span>
        
        <span class="with-love">
    	 <i class="iconfont icon-love"></i> 
         </span>
         
            <span class="author" itemprop="copyrightHolder"><a href="http://blog.mr-wei.cn">Mr.wei</a> | </span> 
         

         
            <a href="http://www.miibeian.gov.cn/" target="_blank" rel="external nofollow">冀ICP备 - 18032379号 </a> |
         
		  <span>Powered by <a href="https://gohugo.io/" target="_blank" rel="external nofollow">Hugo</a> & <a href="https://github.com/liuzc/leaveit" target="_blank" rel="external nofollow">LeaveIt</a></span> 
    </div>

	
<script type="text/x-mathjax-config">
    MathJax.Hub.Config({
        tex2jax: {
            inlineMath: [['$','$'], ['\\(','\\)']],
            displayMath: [['$$','$$'], ['\[','\]']],
            processEscapes: true,
            processEnvironments: true,
            skipTags: ['script', 'noscript', 'style', 'textarea', 'pre'],
            TeX: {
                equationNumbers: { autoNumber: "AMS" },
                extensions: ["AMSmath.js", "AMSsymbols.js"]
            }
        }
    });
</script>
<script type="text/javascript" async src="https://cdnjs.cloudflare.com/ajax/libs/mathjax/2.7.5/MathJax.js?config=TeX-MML-AM_CHTML"></script>
	
	

</footer>












    
    
    <script src="/js/vendor_no_gallery.min.js" async=""></script>
    
  



     </div>
  </body>
</html>
